<?php
// session处理引擎
// 主要功能：开 关 读 写 卸 垃圾处理
class FileHandle implements SessionHandlerInterface
{
    protected $path;
    protected $max_lifetime;

    // 构造函数传入session保存路径和过期时间 默认24分钟
    public function __construct(string $path, int $max_lifetime = 1440)
    {
        $this->path = $path;
        $this->mkdir();
        $this->max_lifetime = $max_lifetime;
    }

    // 关闭
    public function close(): bool
    {
        return true;
    }

    // 卸载
    public function destroy(string $id): bool
    {
        if (is_file($this->path . '/' . $id)) {
            // 删除文件
            @unlink($this->path . '/' . $id);
        }
        return true;
    }

    // 垃圾处理
    public function gc(int $max_lifetime): int|false
    {
        // 便利存储session文件夹里的所有文件
        foreach (glob($this->path . '/*') as $file) {
            // 该文件的修改时间加上规定的时间还小于现在的时间，就是过期
            if (filemtime($file) + $this->max_lifetime < time()) {
                // 删除该session文件
                @unlink($file);
            }
        }
        return true;
    }

    // 创建目录
    protected function mkdir()
    {
        // 检测存储session的目录，无目录就创建
        is_dir($this->path) or mkdir($this->path, 0755, true);
    }
    // session开启 
    public function open(string $path, string $name): bool
    {
        return true;
    }

    //读取，通过session_id
    public function read(string $id): string|false
    {
        // 读取session并强转成字符创
        return (string)@file_get_contents($this->path . '/' . $id);
    }

    // 写
    public function write(string $id, string $data): bool
    {
        // 往session写入，返回值强转为bool  @强转并忽略错误
        return (bool)@file_put_contents($this->path . '/' . $id, $data);
    }
}